'''
通过浏览器直接下载的数据和通过request获取的数据不一样
前端渲染：（前端对数据做了填充）
浏览器会对html源码做一些修饰，因为它会执行里面的js代码，让数据可以呈现出来

后端渲染：（web服务器对数据都做好了规范化，浏览器几乎什么也不用干，我得到什么数据浏览器就呈现什么数据）
request下载的源代码不会运行js


#chrome浏览器通过driver（引擎）操作selenium
# selenium可以操作不止chrome浏览器，火狐等 也可以.

pip install kuser_agent
kuser_agent.get()

'''

from selenium import webdriver
import pandas as pd
import ktool
import time

# 记录XPath语句
class X():
    d3 = '//div[@class="e_e e_com"]/p[@class="at"]' # 被点击的职能按钮 对象
    sbar_li = '//ul[@class="sbar"]/li' # 一级分类 对象
    category2 = '//div[@class="de d3"]/div/table//td//text()' # 2级分类 文本
    category2_element = '//div[@class="panel_selt"]//*[text()="{text}"]'
    category3 = '//div[@class="de d3"]//div[@class="in"]//td//text()'

# 职位搜索URL
url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,+,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='


# 实例化driver
driver = webdriver.Chrome(
    executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe' )
    # Windows需要加exe cutable_path,而Mac和Linux不用!!!!!!!!!!!!!

# 以GET的方式访问51job职位搜索页面
driver.get(url = url)

# 点击"工作职能"
driver.find_element_by_xpath(X.d3).click()

#find_element_by_xpath返回一个对象，找不到会报错！！！！！！！！！！
# find_elements_by_xpath返回一个列表，找不到返回空列表！！！！！！！


# 得到1级分类的li对象
sbar_lis = driver.find_elements_by_xpath('//ul[@class="sbar"]/li')
datas = []

# 对1级分类的li对象进行遍历，逐一点击
for sbar_li in sbar_lis:
    # 得到1级分类的名字
    category1 = sbar_li.text.strip()
    # 点击li对象
    sbar_li.click()
    # 延时1秒钟
    time.sleep(1)
    # 得到所有的2级分类名称
    category2s = ktool.xpath.xpath_all(driver.page_source,X.category2)


    # 对2级分类的名称进行遍历
    for category2 in category2s:
        # 根据2级分类名称，构造XPath定位，并点击2级分类
        driver.find_element_by_xpath(X.category2_element.format(text=category2)).click()
        # 延时1秒
        time.sleep(1)
        # 得到3级分类
        category3s = ktool.xpath.xpath_all(driver.page_source, X.category3)
        # 打印1级分类、2级分类、3级分类
        print(category1, category2, category3s)


        #添加数据
        datas.append(
            dict(
                level1=category1,
                level2=category2,
                level3s=category3s,
            )
        )
print(datas)

import pickle
pickle.dump(datas,open('datas.pk1','wb'))







